home *** CD-ROM | disk | FTP | other *** search
- /*
- File: CMDoc.cpp
-
- Contains: Implementation for CMDoc class.
-
- Owned by: Vincent Lo
-
- Copyright: © 1993 - 1996 by Apple Computer, Inc., all rights reserved.
-
- Change History (most recent first):
-
- <7> 8/19/96 DH 1376276:OpenDoc corrupts document when it
- runs out of disk space creating draft. Made
- more exceptions fatal container errors.
- Changed writing out new draft version list
- to work around bug with old space being
- reused too soon. Made numerous values temps
- so their useCount is properly set.
- <6> 7/25/96 DH Fixed NewCMDraft methods to check the
- somClassReference allocation and throw if
- null (No bug #, approved by Bern).
- <5> 6/6/96 jpa T10020: Avoid compiler warning (and ODIText
- leak!) in CMDocumentGetName.
- <4> 5/24/96 jpa 1246074: SOM_CATCH --> SOM_TRY..SOM_ENDTRY
- <2> 3/15/96 DM 1295410: create list iterators on stack
- (avoid mem thrash during purge)
-
- To Do:
- In Progress:
-
- */
-
- #define CMDocument_Class_Source
- #define VARIABLE_MACROS
- #include <CMDoc.xih>
-
- #ifndef SOM_ODContainer_xh
- #include <ODCtr.xh>
- #endif
-
- #ifndef SOM_ODStorageUnit_xh
- #include <StorageU.xh>
- #endif
-
- #ifndef _EXCEPT_
- #include "Except.h"
- #endif
-
- #ifndef _TEMPOBJ_
- #include "TempObj.h"
- #endif
-
- #ifndef _FLIPEND_
- #include "FlipEnd.h"
- #endif
-
- #ifndef SOM_ODEmbeddedContainer_xh
- #include <EmbedCtr.xh>
- #endif
-
- #ifndef SOM_CMDraft_xh
- #include <CMDraft.xh>
- #endif
-
- #ifndef SOM_ODSession_xh
- #include <ODSessn.xh>
- #endif
-
- #ifndef __STRING__
- #include <string.h> // For strlen, strcpy....
- #endif
-
- #ifndef _INDHDR_
- #include "IndHdr.h" // For Embedded Property and Type names
- #endif
-
- #ifndef _CMCTR_
- #include "CMCtr.xh" // Just for getting fContainer
- #endif
-
- #ifndef _DOCPRIV_
- #include "DocPriv.h"
- #endif
-
- #ifndef _ISOSTR_
- #include "ISOStr.h"
- #endif
-
- #ifndef SOM_Module_OpenDoc_StdProps_defined
- #include <StdProps.xh>
- #endif
-
- #ifndef SOM_Module_OpenDoc_StdTypes_defined
- #include <StdTypes.xh>
- #endif
-
- #ifndef _ODMEMORY_
- #include "ODMemory.h"
- #endif
-
- #ifndef _ODNEW_
- #include "ODNew.h"
- #endif
-
- #ifndef _BENTODEF_
- #include "BentoDef.h"
- #endif
-
- #ifndef _ODDEBUG_
- #include <ODDebug.h>
- #endif
-
- #ifndef _ITEXT_
- #include <IText.h>
- #endif
-
- #ifndef _UTILERRS_
- #include "UtilErrs.h"
- #endif
-
- #ifndef __TIME_H__
- #include <Time.h>
- #endif
-
- #ifndef _SESSHDR_
- #include "SessHdr.h"
- #endif
-
- #ifndef _BENTOSUPPRESS_
- #include "BentoSuppress.h"
- #endif
-
- #pragma segment CMDocument
-
- //==============================================================================
- // Constants
- //==============================================================================
-
- // Private ISO Strings
- const ODPropertyName kODDocumentProperties = "+//ISO 9070/ANSI::113722::US::CI LABS::OpenDoc:Bento Container Suite:Property:DocumentProperties";
- const ODValueType kODVersionList = "+//ISO 9070/ANSI::113722::US::CI LABS::OpenDoc:Bento Container Suite:Type:CMVersionList";
-
- // For debugging
-
- #if ODDebug
- // #define ODDebug_Drafts 1
- // #define ODDebug_DebugRefCount 1
- #endif
-
- //==============================================================================
- // Function Prototype
- //==============================================================================
-
- static CMDraft* NewCMDraft(ODMemoryHeapID heapID);
- static CMObject AcquireDocumentPropertiesObject(CMContainer container);
-
- // The following two functions need to be filled in when we are moving to a
- // real multithread system.
-
- #define EnableInterrupt()
- #define DisableInterrupt()
-
-
- // For debugging
-
- #ifdef DebugStorage
-
- #define MyDebugStr(s) do {somPrintf(s);} while (0)
- #define MyDebug1Str(f,p1) do {somPrintf(f, p1);} while (0)
- #define MyDebug2Str(f,p1,p2) do {somPrintf(f, p1, p2);} while (0)
- #define MyDebug3Str(f,p1,p2,p3) do {somPrintf(f, p1, p2,p3);} while (0)
-
- #else
-
- #define MyDebugStr(s)
- #define MyDebug1Str(f,p1)
- #define MyDebug2Str(f,p1,p2)
- #define MyDebug3Str(f,p1,p2,p3)
-
- #endif
-
- #if ODDebug_Drafts
-
- #ifndef _MEMDEBG_
- #include <MemDebg.h>
- #endif
-
- static void PrintDrafts(Environment* ev, DraftList* drafts, char* string);
- static void PrintHeapInfo();
- #endif
-
-
- //==============================================================================
- // CMDocument
- //==============================================================================
-
- //------------------------------------------------------------------------------
- // CMDocument: GetCMVersionList
- //------------------------------------------------------------------------------
-
- SOM_Scope CMValue SOMLINK CMDocumentGetCMVersionList(CMDocument *somSelf, Environment *ev)
- {
- CMDocumentData *somThis = CMDocumentGetData(somSelf);
- CMDocumentMethodDebug("CMDocument","CMDocumentGetCMVersionList");
-
- // The CMValue returned by this method must be realeased by calling CMReleaseValue().
- // You can do this automatically by using the TempCMValue class.
-
- SOM_TRY
-
- CMContainer cmContainer = _fContainer->GetCMContainer(ev);
- ODSessionMustHaveCMAllocReserve(cmContainer);
-
- CMProperty versionListProp;
- CMObject versionListObj;
-
- if ((versionListProp = CMRegisterProperty(cmContainer, kODPropVersionList)) == kODNULL)
- THROW(kODErrBentoInvalidProperty);
-
- versionListObj = CMGetNextObjectWithProperty(cmContainer, kODNULL, versionListProp);
-
- TempCMValue versionList = kODNULL;
- if ( versionListObj )
- versionList = CMGetNextValue(versionListObj, versionListProp, kODNULL);
-
- ODSessionRestoreCMAllocReserve(cmContainer);
-
- return versionList.DontRelease();
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- return kODNULL;
- }
-
- //------------------------------------------------------------------------------
- // CMDocument: AcquireDraftGut
- //------------------------------------------------------------------------------
-
- SOM_Scope CMDraft* SOMLINK CMDocumentAcquireDraftGut(CMDocument *somSelf, Environment *ev,
- VersionList* versionList,
- ODDraftPermissions perms,
- ODDraftID id,
- CMDraft* draft,
- ODPositionCode posCode,
- ODBoolean release)
- {
- CMDocumentData *somThis = CMDocumentGetData(somSelf);
- CMDocumentMethodDebug("CMDocument","CMDocumentAcquireDraftGut");
-
- SOM_TRY
-
- #if ODDebug_Drafts
- somPrintf("**** Entering AcquireDraftGut: id %d draft %x posCode %d release %d\n", id, draft, posCode, release);
- PrintDrafts(ev, _fDrafts, "**** Entering AcquireDraftGut");
- somSelf->GetVersionList(ev)->Print(">>> Entering AcquireDraftGut");
- #endif
-
- CMDraft* fromDraft = (CMDraft*) draft;
- CMDraft* newDraft = kODNULL;
- ODDraftID latestDraftID;
- ODDraftID fromDraftID;
- ODDraftID prevDraftID;
- ODDraftID nextDraftID;
-
- if (id != 0) {
- if ((newDraft = _fDrafts->Get(id)) != kODNULL) {
- if ((perms == kODDPReadOnly) ||
- (newDraft->GetPermissions(ev) == kODDPExclusiveWrite)) {
- newDraft->Acquire(ev);
- MyDebugStr("**** AcquireDraft: Acquire only.\n");
- }
- else
- THROW(kODErrInvalidPermissions);
- }
- else if ((newDraft = _fReleasedDrafts->Get(id)) != kODNULL) {
- if (perms == kODDPExclusiveWrite) {
- if (newDraft->GetPermissions(ev) == kODDPReadOnly) {
- latestDraftID = versionList->GetLatestDraftID();
- if (versionList->IsAbove(latestDraftID, id) != kODFalse)
- THROW(kODErrInvalidPermissions);
- MyDebugStr("**** AcquireDraft: From ReadOnly to ExclusiveWrite.\n");
- }
- }
- newDraft->Reinitialize(ev, perms);
- _fReleasedDrafts->Remove(id);
- _fDrafts->Add(id, newDraft);
- newDraft->Acquire(ev);
- MyDebugStr("**** AcquireDraft: Back from the _fReleasedDrafts pile.\n");
- }
- else {
- newDraft = NewCMDraft(somSelf->GetHeap(ev));
- newDraft->InitDraft(ev, somSelf, id, perms);
-
- _fDrafts->Add(id, newDraft);
-
- MyDebug3Str("**** id %d draft %x perms %d\n", id, newDraft, newDraft->GetPermissions(ev));
- }
- }
- else {
- if ((posCode != kODPosTop) && (fromDraft == kODNULL)) {
- THROW(kODErrInvalidDraftID);
- }
- switch (posCode) {
- case kODPosTop:
- if (fromDraft != kODNULL)
- THROW(kODErrInvalidDraftID);
- nextDraftID = versionList->GetLatestDraftID();
- newDraft = somSelf->AcquireDraftGut(ev, versionList,
- perms,
- nextDraftID,
- kODNULL,
- kODPosUndefined,
- kODFalse);
- break;
- case kODPosSame:
- if (fromDraft->GetPermissions(ev) == perms) {
- if (release == kODFalse)
- fromDraft->Acquire(ev);
- newDraft = fromDraft;
- }
- else {
- if (fromDraft->GetRefCount(ev) != 1)
- THROW(kODErrRefCountNotEqualOne);
- if (release == kODFalse)
- THROW(kODErrCannotChangePermissions);
- fromDraftID = fromDraft->GetID(ev);
- fromDraft->Release(ev);
- newDraft = somSelf->AcquireDraftGut(ev, versionList,
- perms,
- fromDraftID,
- kODNULL,
- kODPosUndefined,
- kODFalse);
- }
- break;
- case kODPosFirstBelow:
- case kODPosLastBelow:
- fromDraftID = fromDraft->GetID(ev);
- prevDraftID = versionList->GetPreviousDraftID(fromDraftID);
- if (release != kODFalse)
- fromDraft->Release(ev);
- newDraft = somSelf->AcquireDraftGut(ev, versionList,
- perms,
- prevDraftID,
- kODNULL,
- kODPosUndefined,
- kODFalse);
- break;
- case kODPosFirstAbove:
- case kODPosLastAbove:
- fromDraftID = fromDraft->GetID(ev);
- nextDraftID = versionList->GetNextDraftID(fromDraftID);
- if (release != kODFalse)
- fromDraft->Release(ev);
- newDraft = somSelf->AcquireDraftGut(ev, versionList,
- perms,
- nextDraftID,
- kODNULL,
- kODPosUndefined,
- kODFalse);
- break;
- case kODPosUndefined:
- case kODPosAll:
- case kODPosFirstSib:
- case kODPosLastSib:
- case kODPosNextSib:
- case kODPosPrevSib:
- default:
- THROW(kODErrUnsupportedPosCode);
- break;
- }
- }
-
- #if ODDebug_Drafts
- PrintDrafts(ev, _fDrafts, "**** Exiting AcquireDraftGut");
- somSelf->GetVersionList(ev)->Print(">>> Exiting AcquireDraftGut");
- #endif
-
- return newDraft;
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- return kODNULL;
- }
-
- //------------------------------------------------------------------------------
- // CMDocument: ~CMDocument
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK CMDocumentsomUninit(CMDocument *somSelf)
- {
- CMDocumentData *somThis = CMDocumentGetData(somSelf);
- CMDocumentMethodDebug("CMDocument","CMDocumentsomUninit");
-
- TRY
-
- Environment* ev = somGetGlobalEnvironment();
-
- DraftListIterator iter(_fDrafts);
- iter.Initialize();
-
- DraftListIterator releasedDraftsIter(_fReleasedDrafts);
- releasedDraftsIter.Initialize();
-
- CMDraft* draft;
-
- #if ODDebug_DebugRefCount
- if (somSelf->GetRefCount(ev) != 0)
- DebugStr("\pRefCount of Document is not 0 at uninit.");
- somPrintf("~CMDocument %x RefCount %d\n", somSelf, somSelf->GetRefCount(ev));
- #endif
-
- draft = iter.Last();
- while (draft != kODNULL) {
- delete draft;
- draft = iter.Previous();
- }
-
- draft = releasedDraftsIter.Last();
- while (draft != kODNULL) {
- delete draft;
- draft = releasedDraftsIter.Previous();
- }
-
- // delete iter;
- // delete releasedDraftsIter;
-
- delete _fVersions;
- delete _fDrafts;
- delete _fReleasedDrafts;
-
- parent_somUninit(somSelf);
-
-
- CATCH_ALL
- ENDTRY
- }
-
- //------------------------------------------------------------------------------
- // CMDocument: Purge
- //------------------------------------------------------------------------------
-
- SOM_Scope ODSize SOMLINK CMDocumentPurge(CMDocument *somSelf, Environment *ev,
- ODSize size)
- {
- CMDocumentData *somThis = CMDocumentGetData(somSelf);
- CMDocumentMethodDebug("CMDocument","CMDocumentPurge");
-
- ODSize purgedSize = 0; ODVolatile( purgedSize );
-
- SOM_TRY
- DraftListIterator draftList(_fDrafts);
- draftList.Initialize();
- CMDraft* draft = draftList.Last();
- while (draft != kODNULL) {
- TRY
- purgedSize += draft->Purge(ev, size-purgedSize);
- CATCH_ALL
- ENDTRY
- draft = draftList.Previous();
- }
- // delete draftList;
-
- purgedSize += parent_Purge(somSelf, ev, size);
- SOM_CATCH_ALL
- WARN("Error %ld trying to purge in CMDocumentPurge",ErrorCode());
- SetErrorCode(kODNoError); // Eat the exception; Purge should not
- // propagate it because clients function
- // fine whether memory was purged or not.
- SOM_ENDTRY
-
- return purgedSize;
- }
-
- //------------------------------------------------------------------------------
- // CMDocument: Acquire
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK CMDocumentAcquire(CMDocument *somSelf, Environment *ev)
- {
- // CMDocumentData *somThis = CMDocumentGetData(somSelf);
- CMDocumentMethodDebug("CMDocument","CMDocumentAcquire");
-
- parent_Acquire(somSelf,ev);
- }
-
- //------------------------------------------------------------------------------
- // CMDocument: Release
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK CMDocumentRelease(CMDocument *somSelf, Environment *ev)
- {
- CMDocumentData *somThis = CMDocumentGetData(somSelf);
- CMDocumentMethodDebug("CMDocument","CMDocumentRelease");
-
- SOM_TRY
-
- #if TestFlushContainer
- if (_fContainer->GetDirtyFlag(ev) != kODFalse)
- somSelf->ExternalizeVersionList(ev, kODFalse);
- #endif
-
- parent_Release(somSelf,ev);
- if (somSelf->GetRefCount(ev) == 0) {
- _fContainer->ReleaseDocument(ev, somSelf);
- }
-
- SOM_CATCH_ALL
-
- ODError err = ErrorCode();
-
- WARN("Error occurred in ODDocument::Release: %d %s", err, ErrorMessage() ?ErrorMessage() :"");
-
- if (err == kODErrBentoErr)
- SetErrorCode(kODErrUndefined);
- else if (err != kODErrUndefined)
- SetErrorCode(kODNoError);
-
- SOM_ENDTRY
- }
-
- //------------------------------------------------------------------------------
- // CMDocument: AcquireContainer
- //------------------------------------------------------------------------------
-
- SOM_Scope ODContainer* SOMLINK CMDocumentGetContainer(CMDocument *somSelf, Environment *ev)
- {
- CMDocumentData *somThis = CMDocumentGetData(somSelf);
- CMDocumentMethodDebug("CMDocument","CMDocumentGetContainer");
-
- return (ODContainer*) _fContainer;
- }
-
- //------------------------------------------------------------------------------
- // CMDocument: GetID
- //------------------------------------------------------------------------------
-
- SOM_Scope ODDocumentID SOMLINK CMDocumentGetID(CMDocument *somSelf, Environment *ev)
- {
- CMDocumentData *somThis = CMDocumentGetData(somSelf);
- CMDocumentMethodDebug("CMDocument","CMDocumentGetID");
-
- return _fID;
- }
-
- //------------------------------------------------------------------------------
- // CMDocument: GetName
- //------------------------------------------------------------------------------
-
- SOM_Scope ODDocumentName SOMLINK CMDocumentGetName(CMDocument *somSelf, Environment *ev)
- {
- CMDocumentData *somThis = CMDocumentGetData(somSelf);
- CMDocumentMethodDebug("CMDocument","CMDocumentGetName");
-
- ODDocumentName name;
- InitIText(&name);
-
- SOM_TRY
-
- CMContainer cmContainer = _fContainer->GetCMContainer(ev);
- ODSessionMustHaveCMAllocReserve(cmContainer);
-
- CMObject cmObject = AcquireDocumentPropertiesObject(cmContainer);
- ASSERTM(cmObject, kODErrNoDocumentProperties, "No Document Properties Object.");
-
- CMProperty cmProp = CMRegisterProperty(cmContainer, kODPropDocumentName);
- CMType cmType = CMRegisterType(cmContainer, kODMacIText);
- CMValue cmValue = CMUseValue(cmObject, cmProp, cmType);
-
- if (cmValue != kODNULL) {
- ODITextFormat stdFormat;
- CMReadValueData(cmValue, &stdFormat, 0, sizeof(ODITextFormat));
- ODITextFormat format = ConvertODULongFromStd(stdFormat);
-
- if( format != kODTraditionalMacText ) {
- WARN("Reading IText in unknown format %ld",format);
- THROW(kODErrInvalidPersistentFormat);
- }
- ODULong size = CMGetValueSize(cmValue) - sizeof(ODITextFormat);
- name.format = format;
- SetITextBufferSize(&name,size,kODFalse);
- CMReadValueData(cmValue, name.text._buffer, sizeof(ODITextFormat), name.text._length);
- } else {
- SetITextStringLength(&name,0,kODFalse);
- somSelf->SetName(ev, &name);
- }
-
- ODSessionRestoreCMAllocReserve(cmContainer);
-
- SOM_CATCH_ALL
- SOM_ENDTRY
-
- return name;
- }
-
- //------------------------------------------------------------------------------
- // CMDocument: SetName
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK CMDocumentSetName(CMDocument *somSelf, Environment *ev,
- ODDocumentName* name)
- {
- CMDocumentData *somThis = CMDocumentGetData(somSelf);
- CMDocumentMethodDebug("CMDocument","CMDocumentSetName");
-
- SOM_TRY
-
- CMContainer cmContainer = _fContainer->GetCMContainer(ev);
- ODSessionMustHaveCMAllocReserve(cmContainer);
-
- CMObject cmObject = AcquireDocumentPropertiesObject(cmContainer);
- ASSERTM(cmObject, kODErrNoDocumentProperties, "No Document Properties Object.");
-
- CMProperty cmProp = CMRegisterProperty(cmContainer, kODPropDocumentName);
- CMType cmType = CMRegisterType(cmContainer, kODMacIText);
- CMValue cmValue = CMUseValue(cmObject, cmProp, cmType);
- if (cmValue == kODNULL) {
- cmValue = CMNewValue(cmObject, cmProp, cmType);
- }
- ODITextFormat stdFormat = ConvertODULongToStd(name->format);
- CMWriteValueData(cmValue, &stdFormat, 0, sizeof(ODITextFormat));
- CMWriteValueData(cmValue, name->text._buffer, sizeof(ODITextFormat), name->text._length);
-
- ODSessionRestoreCMAllocReserve(cmContainer);
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- }
-
- //------------------------------------------------------------------------------
- // CMDocument: CollapseDrafts
- //------------------------------------------------------------------------------
-
- SOM_Scope ODDocument* SOMLINK CMDocumentCollapseDrafts(CMDocument *somSelf, Environment *ev,
- ODDraft* fromDraft,
- ODDraft* toDraft)
- {
- CMDocumentData *somThis = CMDocumentGetData(somSelf);
- CMDocumentMethodDebug("CMDocument","CMDocumentCollapseDrafts");
-
- SOM_TRY
-
- CMDraft* from = (CMDraft*) fromDraft;
- CMDraft* to = (CMDraft*) toDraft; ODVolatile(to);
- VersionList* versionList = kODNULL;
- ODDraftID fromID = from->GetID(ev);
- ODDraftID toID;
- ODDraftID baseID;
- // ODBoolean releaseToDraft = kODFalse; ODVolatile(releaseToDraft);
- ODBoolean revertIt = kODFalse;
-
- TempODDraft tempDraft = kODNULL; // DMc - better way to release
-
- versionList = somSelf->TestAndGetVersionList(ev);
- ASSERT((versionList != kODNULL), kODErrDraftDoesNotExist);
-
- TRY
-
- baseID = versionList->GetBaseDraftID();
-
- if (to == kODNULL) {
- toID = versionList->GetPreviousDraftID(fromID);
- to = (CMDraft*) somSelf->AcquireDraft(ev, kODDPReadOnly, toID, kODNULL, kODPosUndefined, kODFalse);
- // releaseToDraft = kODTrue;
- tempDraft = to; // ensure it's released
- }
- else {
- toID = to->GetID(ev);
- }
-
- if ((fromID == baseID) || (fromID == toID))
- return somSelf;
- if (versionList->IsAbove(fromID, toID) == kODFalse)
- THROW(kODErrCannotCollapseDrafts);
-
- // from cannot have a ref count more than 1 if it is the top draft
- // if from is not top draft, then we are not going to do anything to the draft
- // and we need not worry about the ref count
-
- if (fromID == _fVersions->GetLatestDraftID())
- if (from->GetRefCount(ev) > 1)
- THROW(kODErrOutstandingDraft);
-
- // Check for outstanding draft
-
- DraftListIterator draftList(_fDrafts);
- draftList.Initialize();
- CMDraft* draft = draftList.Last();
- while (draft != kODNULL) {
- ODDraftID draftID = draft->GetID(ev);
- if ((versionList->IsBelow(draftID, fromID) != kODFalse) &&
- (versionList->IsAbove(draftID, toID) != kODFalse) &&
- (versionList->GetCurrentVersion(draftID) != kODTombstonedVersion))
- THROW(kODErrOutstandingDraft);
- else
- draft = draftList.Previous();
- }
- // delete draftList;
-
- // Flush the from draft
-
- if ((from->GetPermissions(ev) == kODDPExclusiveWrite) &&
- (from->NeedExternalizing(ev) != kODFalse))
- THROW(kODErrNonEmptyDraft);
- else if (from->IsChangedFromPrev(ev, versionList) != kODFalse)
- THROW(kODErrNonEmptyDraft);
-
- if (from->IsNewDraft(ev) != kODFalse) {
- revertIt = kODTrue;
- // _fDrafts->Remove(from->GetID(ev));
- ODDraftID id = from->GetID(ev);
- from->Release(ev);
- _fReleasedDrafts->Remove(id);
- from->Abort(ev);
- delete from;
- }
- else {
- // so that the collapsed version list will be written out on close
- _fContainer->SetDirtyFlag(ev, kODTrue);
-
- // Release the draft
-
- from->Release(ev);
- }
-
- // CollapseDrafts on VersionList
-
- versionList->CollapseDrafts(fromID, toID);
-
- #if !TestFlushContainer
- // Make the change persistent
-
- somSelf->ExternalizeVersionList(ev, kODFalse);
- #endif
-
- // If no change, then clear the dirty flag
-
- if (revertIt != kODFalse)
- _fContainer->SetDirtyFlag(ev, kODFalse);
-
- CATCH_ALL
-
- somSelf->ReleaseVersionList(ev);
- RERAISE;
-
- ENDTRY
-
- somSelf->ReleaseVersionList(ev);
-
- //if (releaseToDraft != kODFalse)
- // to->Release(ev);
-
- return somSelf;
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- return somSelf;
- }
-
- //------------------------------------------------------------------------------
- // CMDocument: AcquireDraft
- //------------------------------------------------------------------------------
-
- SOM_Scope ODDraft* SOMLINK CMDocumentAcquireDraft(CMDocument *somSelf, Environment *ev,
- ODDraftPermissions perms,
- ODDraftID id,
- ODDraft* draft,
- ODPositionCode posCode,
- ODBoolean release)
- {
- CMDocumentData *somThis = CMDocumentGetData(somSelf);
- CMDocumentMethodDebug("CMDocument","CMDocumentAcquireDraft");
-
- SOM_TRY
-
- #if ODDebug_Drafts
- somPrintf("&&& AcquireDraft: id %d draft %x posCode %d release %d\n", id, draft, posCode, release);
- #endif
-
- VersionList* versionList;
- ODDraft* newDraft;
-
- versionList = somSelf->TestAndGetVersionList(ev);
- ASSERT((versionList != kODNULL), kODErrDraftDoesNotExist);
-
- TRY
-
- newDraft = somSelf->AcquireDraftGut(ev, versionList, perms, id, (CMDraft*) draft, posCode, release);
-
- CATCH_ALL
-
- somSelf->ReleaseVersionList(ev);
- RERAISE;
-
- ENDTRY
-
- somSelf->ReleaseVersionList(ev);
-
- #if ODDebug_Drafts
- somPrintf("&&& Exiting AcquireDraft\n");
- #endif
-
- return newDraft;
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- return kODNULL;
- }
-
- //------------------------------------------------------------------------------
- // CMDocument: Exists
- //------------------------------------------------------------------------------
-
- SOM_Scope ODBoolean SOMLINK CMDocumentExists(CMDocument *somSelf, Environment *ev,
- ODDraftID id,
- ODDraft* fromDraft,
- ODPositionCode posCode)
- {
- CMDocumentData *somThis = CMDocumentGetData(somSelf);
- CMDocumentMethodDebug("CMDocument","CMDocumentExists");
-
- SOM_TRY
-
- ODBoolean exists = kODFalse;
-
- if (id != 0) {
- exists = _fVersions->Exists(id);
- }
- else if (fromDraft != kODNULL) {
-
- VersionList* versionList = somSelf->TestAndGetVersionList(ev);
- ASSERT((versionList != kODNULL), kODErrDraftDoesNotExist);
-
- TRY
- ODDraftID fromDraftID = fromDraft->GetID(ev);
-
- switch (posCode) {
- case kODPosSame:
- exists = kODTrue;
- break;
- case kODPosFirstBelow:
- case kODPosLastBelow:
- exists = versionList->PreviousDraftExists(fromDraftID);
- break;
- case kODPosFirstAbove:
- case kODPosLastAbove:
- exists = versionList->NextDraftExists(fromDraftID);
- break;
- case kODPosUndefined:
- case kODPosAll:
- case kODPosFirstSib:
- case kODPosLastSib:
- case kODPosNextSib:
- case kODPosPrevSib:
- default:
- THROW(kODErrUnsupportedPosCode);
- break;
- }
- CATCH_ALL
- somSelf->ReleaseVersionList(ev);
- RERAISE;
-
- ENDTRY
- }
- else
- THROW(kODErrInsufficientInfoInParams);
-
- return exists;
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- return kODFalse;
- }
-
- //------------------------------------------------------------------------------
- // CMDocument: AcquireBaseDraft
- //------------------------------------------------------------------------------
-
- SOM_Scope ODDraft* SOMLINK CMDocumentAcquireBaseDraft(CMDocument *somSelf, Environment *ev,
- ODDraftPermissions perms)
- {
- CMDocumentData *somThis = CMDocumentGetData(somSelf);
- CMDocumentMethodDebug("CMDocument","CMDocumentAcquireBaseDraft");
-
- SOM_TRY
-
- CMContainer cmContainer = _fContainer->GetCMContainer(ev);
- ODSessionMustHaveCMAllocReserve(cmContainer);
-
- ODDraftID baseDraftID;
- ODDraft* baseDraft;
- CMProperty versionListProp;
- CMObject versionListObj;
- CMType versionListType;
- ODSByte bogusData[1];
-
- TempCMValue versionList = somSelf->GetCMVersionList(ev);
-
- if ( !versionList ) {
- if ((versionListProp = CMRegisterProperty(cmContainer, kODPropVersionList)) == kODNULL)
- THROW(kODErrBentoInvalidProperty);
- if ((versionListType = CMRegisterType(cmContainer, kODVersionList)) == kODNULL)
- THROW(kODErrBentoInvalidType);
- if ((versionListObj = CMNewObject(cmContainer)) == kODNULL)
- THROW(kODErrBentoCannotNewObject);
- versionList = CMNewValue(versionListObj, versionListProp, versionListType);
-
- if (versionList != kODNULL) {
- CMWriteValueData(versionList, bogusData, 0, 0);
- }
- _fVersions = new(somSelf->GetHeap(ev)) VersionList();
- _fVersions->Initialize();
-
- baseDraft = somSelf->CreateDraft(ev, kODNULL, kODFalse);
- }
- else {
- baseDraftID = _fVersions->GetBaseDraftID();
- baseDraft = somSelf->AcquireDraft(ev, perms, baseDraftID, kODNULL, kODPosUndefined, kODFalse);
- }
-
- ODSessionRestoreCMAllocReserve(cmContainer);
- return baseDraft;
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- return kODNULL;
- }
-
- //------------------------------------------------------------------------------
- // CMDocument: CreateDraft
- //------------------------------------------------------------------------------
-
- SOM_Scope ODDraft* SOMLINK CMDocumentCreateDraft(CMDocument *somSelf, Environment *ev,
- ODDraft* below,
- ODBoolean releaseBelow)
- {
- CMDocumentData *somThis = CMDocumentGetData(somSelf);
- CMDocumentMethodDebug("CMDocument","CMDocumentCreateDraft");
-
- SOM_TRY
-
- #if ODDebug_Drafts
- somPrintf("### Entering CreateDraft: below %x releaseBelow %d\n", below, releaseBelow);
- PrintDrafts(ev, _fDrafts, "### Entering CreateDraft");
- somSelf->GetVersionList(ev)->Print(">>> Entering CreateDraft");
- #endif
-
- ODDraftID prevDraftID;
- CMDraft* newDraft;
- VersionList* versionList;
-
- versionList = somSelf->TestAndGetVersionList(ev);
- ASSERT((versionList != kODNULL), kODErrDraftDoesNotExist);
-
- TRY
-
- prevDraftID = versionList->GetLatestDraftID();
- if ((prevDraftID != 0) &&
- (below != kODNULL) &&
- (prevDraftID != below->GetID(ev)))
- THROW(kODErrInvalidBelowDraft);
-
- if (releaseBelow != kODFalse) {
- if (below != kODNULL) {
- below->Release(ev);
- }
- }
- else {
- if ((below != kODNULL) && (below->GetPermissions(ev) == kODDPExclusiveWrite)) {
- THROW(kODErrInvalidPermissions);
- }
- }
-
- newDraft = NewCMDraft(somSelf->GetHeap(ev));
- newDraft->InitDraft(ev, somSelf, kODNULL, kODDPExclusiveWrite);
-
- _fDrafts->Add(newDraft->GetID(ev), newDraft);
-
- CATCH_ALL
-
- somSelf->ReleaseVersionList(ev);
- RERAISE;
-
- ENDTRY
-
- somSelf->ReleaseVersionList(ev);
-
- #if ODDebug_Drafts
- PrintDrafts(ev, _fDrafts, "### Exiting CreateDraft");
- somSelf->GetVersionList(ev)->Print(">>> Exiting CreateDraft");
- #endif
-
- return newDraft;
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- return kODNULL;
- }
-
- //------------------------------------------------------------------------------
- // CMDocument: SaveToAPrevDraft
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK CMDocumentSaveToAPrevDraft(CMDocument *somSelf, Environment *ev,
- ODDraft* fromDraft,
- ODDraft* toDraft)
- {
- CMDocumentData *somThis = CMDocumentGetData(somSelf);
- CMDocumentMethodDebug("CMDocument","CMDocumentSaveToAPrevDraft");
-
- SOM_TRY
-
- CMDraft* from = (CMDraft*) fromDraft;
- ODDraftID fromID = from->GetID(ev);
- ODDraftID toID;
- VersionList* versionList;
- ODBoolean notTopDraft = kODFalse;
- ODTime now;
-
- versionList = somSelf->TestAndGetVersionList(ev);
- ASSERT((versionList != kODNULL), kODErrDraftDoesNotExist);
-
- TRY
-
- if (toDraft == kODNULL) {
- toID = _fVersions->GetPreviousDraftID(fromID);
- }
- else {
- toID = toDraft->GetID(ev);
- }
-
- if (fromID == toID)
- return;
-
- if ((_fVersions->Exists(fromID) == kODFalse) ||
- (_fVersions->Exists(toID) == kODFalse) ||
- (versionList->IsAbove(fromID, toID) == kODFalse))
- THROW(kODErrDraftDoesNotExist);
-
- // Check to see whether we have any outstanding ODDraft associated
- // with this document.
-
- DraftListIterator draftList(_fDrafts);
- draftList.Initialize();
-
- CMDraft* draft = draftList.Last();
- while (draft != kODNULL) {
- ODDraftID id = draft->GetID(ev);
- if ((versionList->IsBelow(id, fromID) != kODFalse) &&
- (versionList->IsAbove(id, toID) != kODFalse) &&
- (versionList->GetCurrentVersion(id) != kODTombstonedVersion))
- THROW(kODErrOutstandingDraft);
- else
- draft = draftList.Previous();
- }
- // delete draftList;
-
- // SaveToAPrevDraft on VersionList
-
- _fVersions->SaveToAPrevDraft(fromID, toID);
-
- if (fromID != _fVersions->GetLatestDraftID())
- notTopDraft = kODTrue;
-
- #if !TestFlushContainer
- // Make the version list change persistent
-
- somSelf->ExternalizeVersionList(ev, kODFalse);
- #endif
-
- // Write out if it is an exclusive write container
- if (notTopDraft == kODFalse)
- from->Close(ev);
-
- CMContainer cmContainer = _fContainer->GetCMContainer(ev);
-
- #if TestFlushContainer
-
- // Make the version list change persistent
-
- somSelf->ExternalizeVersionList(ev, notTopDraft);
-
- ODSessionMustHaveCMAllocReserve(cmContainer);
- CMTakeSnapShot(cmContainer, kODFalse);
- #endif
- time(&now);
- ASSERTM(sizeof(ODTime) == sizeof(time_t), kODErrAssertionFailed, "ODTime not same as time_t.");
-
- _fContainer->SetModDate(ev, now);
-
- if (notTopDraft == kODFalse) { // if we have close it before we open it again
- from->Open(ev);
-
- from->SetChangedFromPrevFlag(ev, kODFalse);
- }
-
- // Release to draft if necessary
-
- if (toDraft != kODNULL) {
- ((CMDraft*) toDraft)->Close(ev);
- ((CMDraft*) toDraft)->Open(ev);
- }
- ODSessionMustHaveCMAllocReserve(cmContainer);
-
- CATCH_ALL
-
- somSelf->ReleaseVersionList(ev);
- RERAISE;
-
- ENDTRY
-
- somSelf->ReleaseVersionList(ev);
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- }
-
- //------------------------------------------------------------------------------
- // CMDocument: SetBaseDraftFromForeignDraft
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK CMDocumentSetBaseDraftFromForeignDraft(CMDocument *somSelf, Environment *ev,
- ODDraft* draft)
- {
- CMDocumentData *somThis = CMDocumentGetData(somSelf);
- CMDocumentMethodDebug("CMDocument","CMDocumentSetBaseDraftFromForeignDraft");
-
- SOM_TRY
-
- TempODDraft baseDraft = somSelf->AcquireBaseDraft(ev, kODDPExclusiveWrite);
-
- {
- TempODStorageUnit fromDraftProperties = draft->AcquireDraftProperties(ev);
- TempODStorageUnit toDraftProperties = baseDraft->AcquireDraftProperties(ev);
-
- ODDraftKey key = draft->BeginClone(ev, baseDraft, kODNULL, kODCloneAll);
- TRY
- draft->Clone(ev, key, fromDraftProperties->GetID(ev), toDraftProperties->GetID(ev), kODNULL);
- draft->EndClone(ev, key );
- CATCH_ALL
- draft->AbortClone(ev, key);
- ENDTRY
-
- }
- baseDraft->Externalize(ev);
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- }
-
- //------------------------------------------------------------------------------
- // CMDocument: InitDocument
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK CMDocumentInitDocument(CMDocument *somSelf, Environment *ev,
- ODContainer* container,
- ODDocumentID id)
- {
- CMDocumentData *somThis = CMDocumentGetData(somSelf);
- CMDocumentMethodDebug("CMDocument","CMDocumentInitDocument");
-
- SOM_TRY
-
- /* Moved from somInit. SOM itself sets fields to zero
- _fContainer = (ODBentoContainer*) kODNULL;
- _fID = 0;
- _fDrafts = kODNULL;
- _fReleasedDrafts = kODNULL;
-
- _fVersions = kODNULL;
- _fVersionListSemaphore = 0;
-
- _fHeap = kDefaultHeapID;
- */
-
- somSelf->InitRefCntObject(ev);
-
- _fContainer = (ODBentoContainer*) container;
- if (_fContainer == kODNULL)
- THROW(kODErrIllegalNullContainerInput);
-
- _fID = id;
-
- _fDrafts = new(somSelf->GetHeap(ev)) DraftList;
- _fDrafts->Initialize();
-
- _fReleasedDrafts = new(somSelf->GetHeap(ev)) DraftList;
- _fReleasedDrafts->Initialize();
-
- somSelf->InternalizeVersionList(ev);
-
- if (_fVersions == kODNULL) {
-
- // If we get here, that means we have a new document.
- // A new document makes a container dirty by definition. Therefore,
- // we have to set the dirty flag.
-
- _fContainer->SetDirtyFlag(ev, kODTrue);
-
- // We are not creating a VersionList yet because the user may
- // just close the document without creating any version.
-
- }
-
- _fHeap = _fContainer->GetHeap(ev);
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- }
-
- //------------------------------------------------------------------------------
- // CMDocument: ReleaseDraft
- //------------------------------------------------------------------------------
-
- SOM_Scope ODDocument* SOMLINK CMDocumentReleaseDraft(CMDocument *somSelf, Environment *ev,
- ODDraft* draftToRelease)
- {
- CMDocumentData *somThis = CMDocumentGetData(somSelf);
- CMDocumentMethodDebug("CMDocument","CMDocumentReleaseDraft");
-
- #if ODDebug_Drafts
- somPrintf("@@@ ReleaseDraft: draft %x id %d\n", draftToRelease, draftToRelease->GetID(ev));
- PrintHeapInfo();
- #endif
-
- CMDraft* draft = (CMDraft*) draftToRelease;
- ODDraftID draftID = draft->GetID(ev);
-
- SOM_TRY
- if ((draft = _fDrafts->Get(draftID)) != kODNULL) {
- _fDrafts->Remove(draftID);
- _fReleasedDrafts->Add(draftID, draft);
- if (draft->GetPermissions(ev) == kODDPExclusiveWrite) {
- if (draft->NeedExternalizing(ev) != kODFalse) {
- if (draft->ChangedFromPrev(ev) != kODFalse)
- _fContainer->SetDirtyFlag(ev, kODTrue);
- draft->Close(ev);
- #if !TestFlushContainer
- somSelf->ExternalizeVersionList(ev, kODFalse);
- #endif
- }
- else if (draft->IsNewDraft(ev) != kODFalse) {
- if (draft->GetID(ev) == _fVersions->GetBaseDraftID()) {
- if (draft->ChangedFromPrev(ev) != kODFalse)
- draft->RemoveChanges(ev);
- draft->Close(ev);
- #if !TestFlushContainer
- somSelf->ExternalizeVersionList(ev, kODFalse);
- #endif
- }
- else
- draft->Abort(ev);
- }
- else
- draft->Abort(ev);
- }
- else
- draft->Close(ev);
- }
- else
- THROW(kODErrDraftDoesNotExist);
- SOM_CATCH_ALL
- SOM_ENDTRY
-
- #if ODDebug_Drafts
- somPrintf("@@@ ReleaseDraft: Done.\n");
- PrintHeapInfo();
- #endif
-
- return somSelf;
- }
-
- //------------------------------------------------------------------------------
- // CMDocument: InternalizeVersionList
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK CMDocumentInternalizeVersionList(CMDocument *somSelf, Environment *ev)
- {
- CMDocumentData *somThis = CMDocumentGetData(somSelf);
- CMDocumentMethodDebug("CMDocument","CMDocumentInternalizeVersionList");
-
- SOM_TRY
-
- ODPtr tmpBuffer;
- ODULong versionListSize;
- TempCMValue versionList = somSelf->GetCMVersionList(ev);
-
- if (versionList == kODNULL)
- return;
-
- CMContainer cmContainer = _fContainer->GetCMContainer(ev);
- ODSessionMustHaveCMAllocReserve(cmContainer);
-
- versionListSize = CMGetValueSize(versionList);
-
- tmpBuffer = ODNewPtr(versionListSize, somSelf->GetHeap(ev));
-
- CMReadValueData(versionList, tmpBuffer, 0, versionListSize);
-
- if (_fVersions == kODNULL) {
- _fVersions = new(somSelf->GetHeap(ev)) VersionList;
- _fVersions->Initialize(tmpBuffer, versionListSize);
- }
- else {
- _fVersions->Reinitialize(tmpBuffer, versionListSize);
- }
-
- ODDisposePtr(tmpBuffer);
-
- ODSessionRestoreCMAllocReserve(cmContainer);
-
- #if ODDebug_Drafts
- _fVersions->Print("Internalized VersionList");
- #endif
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- }
-
- //------------------------------------------------------------------------------
- // CMDocument: ExternalizeVersionList
- //------------------------------------------------------------------------------
-
- extern void ODBentoFatalError(ODBoolean allowSuppress); // SessHdr.cpp
-
- SOM_Scope void SOMLINK CMDocumentExternalizeVersionList(CMDocument *somSelf, Environment *ev, ODBoolean ignoreTopDraft)
- {
- CMDocumentData *somThis = CMDocumentGetData(somSelf);
- CMDocumentMethodDebug("CMDocument","CMDocumentExternalizeVersionList");
-
- SOM_TRY
-
- ODPtr tmpBuffer;
- ODULong tmpBufferSize;
- TempCMValue versionList = somSelf->GetCMVersionList(ev);
-
- if (versionList == kODNULL)
- THROW(kODErrNoVersionList);
-
- if (_fVersions != kODNULL) {
- CMContainer cmContainer = _fContainer->GetCMContainer(ev);
- ODSessionMustHaveCMAllocReserve(cmContainer);
-
- #if ODDebug_Drafts
- _fVersions->Print("Externalizing VersionList");
- #endif
- CMSize oldSize = CMGetValueSize(versionList);
-
- _fVersions->ExportTo(&tmpBuffer, &tmpBufferSize, ignoreTopDraft);
-
- // Write out the new version list.
- CMInsertValueData(versionList, tmpBuffer, 0, tmpBufferSize);
-
- // Delete old version list.
- CMDeleteValueData(versionList, tmpBufferSize, oldSize);
-
- // Instead of deleting the data in the current value, let's delete the value, and
- // add again anew.
-
- /*
- ODULong useCount = CMGetValueUseCount(versionList);
- if ( useCount == 1 )
- {
- versionList.DontRelease();
- CMDeleteValue(versionList);
-
- CMProperty versionListProp = CMRegisterProperty(cmContainer, kODPropVersionList);
- if ( !versionListProp )
- THROW(kODErrBentoInvalidProperty);
-
- CMType versionListType = CMRegisterType(cmContainer, kODVersionList);
- if ( !versionListType )
- THROW(kODErrBentoInvalidType);
-
- CMObject versionListObj = CMGetNextObjectWithProperty(cmContainer, kODNULL, versionListProp);
- if ( versionListObj ) {
- versionList = CMNewValue(versionListObj, versionListProp, versionListType);
- if ( versionList )
- CMWriteValueData(versionList, tmpBuffer, 0, tmpBufferSize);
- }
- else {
- WARN("cant %.64s", (versionListObj)? "make version list value" : "find version list property");
- THROW( kODErrInvalidVersionListUseCount );
- }
- }
- else {
- WARN("version list use count is not one: %lu", (unsigned long) useCount);
- THROW( kODErrInvalidVersionListUseCount );
- }
- */
-
- ODDisposePtr(tmpBuffer);
- ODSessionRestoreCMAllocReserve(cmContainer);
-
- }
-
- SOM_CATCH_ALL
-
- ODBentoFatalError(/*allowSuppress*/ kODTrue);
-
- SOM_ENDTRY
- }
-
- //------------------------------------------------------------------------------
- // CMDocument: Reopen
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK CMDocumentReopen(CMDocument *somSelf, Environment *ev)
- {
- CMDocumentData *somThis = CMDocumentGetData(somSelf);
- CMDocumentMethodDebug("CMDocument","Reopen");
-
- SOM_TRY
-
- DraftListIterator iter(_fDrafts);
- CMDraft* draft;
-
- iter.Initialize();
- draft = iter.Last();
- while (draft != kODNULL) {
- draft->Open(ev);
- draft = iter.Previous();
- }
- // delete iter;
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- }
-
- //------------------------------------------------------------------------------
- // CMDocument: GetVersionList
- //------------------------------------------------------------------------------
-
- SOM_Scope VersionList* SOMLINK CMDocumentGetVersionList(CMDocument *somSelf, Environment *ev)
- {
- CMDocumentData *somThis = CMDocumentGetData(somSelf);
- CMDocumentMethodDebug("CMDocument","GetVersionList");
-
- return _fVersions;
- }
-
- //------------------------------------------------------------------------------
- // CMDocument: TestAndGetVersionList
- //------------------------------------------------------------------------------
-
- SOM_Scope VersionList* SOMLINK CMDocumentTestAndGetVersionList(CMDocument *somSelf, Environment *ev)
- {
- CMDocumentData *somThis = CMDocumentGetData(somSelf);
- CMDocumentMethodDebug("CMDocument","TestAndGetVersionList");
-
- SOM_TRY
-
- DisableInterrupt();
-
- if (_fVersionListSemaphore > 0) {
- // if same thread,
- _fVersionListSemaphore++;
- // else {
- // EnableInterrupt();
- // THROW(kODErrVersionListUnavailable);
- //
- }
- else {
- // store the thread
- _fVersionListSemaphore++;
- }
-
- EnableInterrupt();
-
- return _fVersions;
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- return kODNULL;
- }
-
- //------------------------------------------------------------------------------
- // CMDocument: ReleaseVersionList
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK CMDocumentReleaseVersionList(CMDocument *somSelf, Environment *ev)
- {
- CMDocumentData *somThis = CMDocumentGetData(somSelf);
- CMDocumentMethodDebug("CMDocument","ReleaseVersionList");
-
- SOM_TRY
-
- DisableInterrupt();
-
- if (_fVersionListSemaphore > 0) {
- // if (same thread) {
- --_fVersionListSemaphore;
- EnableInterrupt();
- // }
- // else {
- // EnableInterrupt();
- // THROW(kODErrVersionListUnavailable);
- // }
- }
- else {
- EnableInterrupt();
- THROW(kODErrSemaphoreReleased);
- }
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- }
-
- //------------------------------------------------------------------------------
- // CMDocument: GetHeap
- //------------------------------------------------------------------------------
-
- SOM_Scope ODMemoryHeapID SOMLINK CMDocumentGetHeap(CMDocument *somSelf, Environment *ev)
- {
- CMDocumentData *somThis = CMDocumentGetData(somSelf);
- CMDocumentMethodDebug("CMDocument","GetHeap");
-
- return _fHeap;
- }
-
- //------------------------------------------------------------------------------
- // AcquireDocumentPropertiesObject
- //------------------------------------------------------------------------------
-
- static CMObject AcquireDocumentPropertiesObject(CMContainer container)
- {
- CMObject documentPropertiesObject;
- CMProperty docPropertiesProp;
- CMType docPropertiesType;
- CMValue value;
-
- // CMContainer cmContainer = _fContainer->GetCMContainer(ev);
- // ODSessionMustHaveCMAllocReserve(cmContainer);
- // This is a static function which is only called by functions that
- // have already called ODSessionMustHaveCMAllocReserve().
-
- if ((docPropertiesProp = CMRegisterProperty(container, kODDocumentProperties)) == kODNULL)
- THROW(kODErrBentoInvalidProperty);
- documentPropertiesObject = CMGetNextObjectWithProperty(container, kODNULL, docPropertiesProp);
-
- if (documentPropertiesObject == kODNULL) {
-
- CMContainerModeFlags openMode;
-
- CMGetContainerInfo(container, kODNULL, kODNULL, kODNULL, kODNULL, &openMode);
- if (openMode == kCMReading)
- return kODNULL;
-
- if ((docPropertiesType = CMRegisterType(container, kODValue)) == kODNULL)
- THROW(kODErrBentoInvalidProperty);
-
- if ((documentPropertiesObject = CMNewObject(container)) == kODNULL)
- THROW(kODErrBentoCannotNewObject);
-
- if ((value = CMNewValue(documentPropertiesObject, docPropertiesProp, docPropertiesType)) == kODNULL)
- THROW(kODErrBentoCannotNewValue);
-
- CMWriteValueData(value, "", 0, 0);
- }
- // ODSessionRestoreCMAllocReserve(cmContainer);
-
- return documentPropertiesObject;
- }
-
- //------------------------------------------------------------------------------
- // NewCMDraft
- //------------------------------------------------------------------------------
-
- static CMDraft* NewCMDraft(ODMemoryHeapID heapID)
- {
- SOMClass* cmDraftClass = somNewClassReference(CMDraft);
- THROW_IF_NULL( cmDraftClass );
- ODULong size = cmDraftClass->somGetInstanceSize();
- ODPtr buffer = ODNewPtr(size, heapID);
- CMDraft* cmDraft = (CMDraft*) cmDraftClass->somRenew(buffer);
- somReleaseClassReference ( cmDraftClass );
-
- return cmDraft;
- }
-
- #if ODDebug_Drafts
-
- //------------------------------------------------------------------------------
- // PrintDrafts
- //------------------------------------------------------------------------------
-
- static void PrintDrafts(Environment* ev, DraftList* drafts, char* string)
- {
- /*
- DraftListIterator* draftList = new DraftListIterator(drafts);
- draftList->Initialize();
- for (CMDraft* draft = draftList->Last(); draftList->IsNotComplete(); draft = draftList->Previous()) {
- somPrintf("%s: draft %x %d refCount %d\n", string, draft, draft->GetID(ev), draft->GetRefCount(ev));
- }
- delete draftList;
- */
- }
-
- //------------------------------------------------------------------------------
- // PrintHeapInfo
- //------------------------------------------------------------------------------
-
- static void PrintHeapInfo()
- {
- /*
- MemHeap* heapID = 0;
- const char *name;
- size_t allocated;
- size_t free;
- size_t nBlocks;
- size_t nObjects;
- MMGetHeapInfo(heapID,
- &name,
- &allocated,
- &free,
- &nBlocks,
- &nObjects );
- somPrintf("Heap: allocated %d, free %d, nBlocks %d, nObjects %d\n", allocated, free, nBlocks, nObjects);
- */
- }
-
-
- #endif
-
-
-